package config

import (
	"fmt"

	"github.com/spf13/viper"
)

var Conf *config

type config struct {
	App     appConfig     `mapstructure:"app"` // 注意这里映射 yaml 中的 app
	DB      dBConfig      `mapstructure:"db"`
	Redis   redisConfig   `mapstructure:"redis"`
	Email   emailConfig   `mapstructure:"email"`
	Token   tokenConfig   `mapstructure:"token"`
	Weather weatherConfig `mapstructure:"weather"`
}

type tokenConfig struct {
	Expire int `mapstructure:"expire"`
}

type appConfig struct {
	Port       string `mapstructure:"port"`
	EncryptKey string `mapstructure:"encryptoKey"` // 解密key
	InviteCode int    `mapstructure:"inviteCode"`  // 管理员账号注册邀请码
}

type dBConfig struct {
	Username    string `mapstructure:"username"`
	Password    string `mapstructure:"password"`
	Protocol    string `mapstructure:"protocol"`
	Port        int    `mapstructure:"port"`
	Database    string `mapstructure:"database"`
	AutoMigrate bool   `mapstructure:"autoMigrate"`
}

type redisConfig struct {
	Protocol string `mapstructure:"protocol"`
	Port     int    `mapstructure:"port"`
	Password string `mapstructure:"password"`
	DB       int    `mapstructure:"db"`
}

type emailConfig struct {
	Password string `mapstructure:"password"` // 授权码
	Sender   string `mapstructure:"sender"`   // 发件人
	IP       string `mapstructure:"ip"`       // 发件人邮箱
	Subject  string `mapstructure:"subject"`  // 主题
	Host     string `mapstructure:"host"`     // smtp
	Port     int    `mapstructure:"port"`     // 端口
	Expire   int    `mapstructure:"expire"`   // 有效时间 单位秒
}

type weatherConfig struct {
	APIKey string `mapstructure:"apiKey"`
}

// Load 加载配置
func Load() error {
	// TODO: 添加多个配置文件路径，可以根据文件加载数据，默认合并内容
	// 添加多个配置文件路径
	configPaths := []string{
		"./config",
		"./internal/config",
		"../config",
		"../../config",
	}

	for _, path := range configPaths {
		viper.AddConfigPath(path)
	}
	viper.SetConfigName("conf")
	viper.SetConfigType("yaml")

	if err := viper.ReadInConfig(); err != nil {
		return fmt.Errorf("读取配置文件失败: %w", err)
	}

	if err := viper.Unmarshal(&Conf); err != nil {
		return fmt.Errorf("解析配置文件失败: %w", err)
	}

	return nil
}
